home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / dviware / dviapollo / dviapollo.c < prev    next >
C/C++ Source or Header  |  1990-10-01  |  12KB  |  454 lines

  1. /*    DVIAPOLLO -- Apollo TeX DVI File Display Driver using GPR         */
  2. /*                                         */
  3. /*    Copyright (C) 1987 by Leonard N. Zubkoff, All Rights Reserved         */
  4. /*                                         */
  5. /*    This software is provided free and without any warranty.         */
  6. /*    Permission to copy for any purpose is hereby granted so             */
  7. /*    long as this copyright notice remains intact.                 */
  8. /*                                         */
  9. /*    Revision:     2-Jun-88 21:57:19                     */
  10.  
  11.  
  12. #define begin        {
  13. #define end        }
  14. #define then
  15. #define do
  16. #define hidden        static
  17. #define visible
  18. #define procedure   void
  19.  
  20.  
  21. #include "header.h"
  22. #include "genwindow.h"
  23. #include <sys/file.h>
  24.  
  25.  
  26. #include "/sys/ins/base.ins.c"
  27. #include "/sys/ins/gpr.ins.c"
  28. #include "/sys/ins/ios.ins.c"
  29. #include "/sys/ins/kbd.ins.c"
  30. #include "/sys/ins/pad.ins.c"
  31.  
  32.  
  33. #define MaxFontID        64
  34. #define MaxTextObjectsPerPage    10000
  35. #define MaxBoxObjectsPerPage    10000
  36. #define MaxCharactersPerPage    10000
  37. #define AutomaticXoffset    -32768
  38. #define VisibleListSize        64
  39. #define NIL            0L
  40.  
  41.  
  42. hidden DVIwindow
  43.     CurrentDVIwindow;
  44.  
  45. hidden boolean
  46.     ScreenUnobscured;
  47.  
  48.  
  49. hidden short
  50.     Xoffset,
  51.     Yoffset,
  52.     ScreenVisibleCount,
  53.     ScreenFontID = -1,
  54.     CurrentPage = 0,
  55.     FontCharacterWidths[MaxFontID][128];
  56.  
  57. hidden int
  58.     TextObjectCount,
  59.     BoxObjectCount,
  60.     CharacterCount,
  61.     MinPageX;
  62.  
  63.  
  64. hidden struct
  65.     begin
  66.     short Start;
  67.     short Count;
  68.     short X;
  69.     short Y;
  70.     short FontID;
  71.     short Xlimit;
  72.     end
  73.     TextObjects[MaxTextObjectsPerPage];
  74.  
  75.  
  76. hidden struct
  77.     begin
  78.     short X;
  79.     short Y;
  80.     short Width;
  81.     short Height;
  82.     end
  83.     BoxObjects[MaxBoxObjectsPerPage];
  84.  
  85.  
  86. hidden char
  87.     Characters[MaxCharactersPerPage];
  88.  
  89.  
  90. hidden gpr_$pixel_value_t
  91.     Background,
  92.     Foreground;
  93.  
  94.  
  95. hidden gpr_$bitmap_desc_t
  96.     ScreenBitmap;
  97.  
  98.  
  99. hidden gpr_$offset_t
  100.     ScreenBitmapSize;
  101.  
  102.  
  103. hidden gpr_$window_t
  104.     ScreenVisibleList[VisibleListSize];
  105.  
  106. visible procedure ShowError(Message)
  107.     char *Message;
  108.     begin
  109.     status_$t Status;
  110.     short AcquireCount;
  111.     gpr_$force_release(AcquireCount,Status);
  112.     fprintf(stderr,"dviapollo: %s\n",Message);
  113.     exit(1);
  114.     end;
  115.  
  116.  
  117. hidden procedure AcquireDisplay()
  118.     begin
  119.     status_$t Status;
  120.     ScreenUnobscured = gpr_$acquire_display(Status);
  121.     if (!ScreenUnobscured) then
  122.         gpr_$inq_vis_list(VisibleListSize,ScreenVisibleCount,
  123.                   ScreenVisibleList,Status);
  124.     else ScreenVisibleCount = 1;
  125.     end
  126.  
  127.  
  128. hidden procedure ReleaseDisplay()
  129.     begin
  130.     static gpr_$window_t FullClipWindow =
  131.         { 0, 0, gpr_$max_x_size, gpr_$max_y_size };
  132.     status_$t Status;
  133.     if (!ScreenUnobscured) then
  134.         gpr_$set_clip_window(FullClipWindow,Status);
  135.     gpr_$release_display(Status);
  136.     end
  137.  
  138.  
  139. visible procedure ClearScreen()
  140.     begin
  141.     status_$t Status;
  142.     int i;
  143.     AcquireDisplay();
  144.     for (i=0; i<ScreenVisibleCount; i++) do
  145.         begin
  146.         if (!ScreenUnobscured) then
  147.             gpr_$set_clip_window(ScreenVisibleList[i],Status);
  148.         gpr_$clear(Background,Status);
  149.         end;
  150.     ReleaseDisplay();
  151.     end
  152.  
  153.  
  154. visible procedure BeginPageDisplay()
  155.     begin
  156.     TextObjectCount = 0;
  157.     BoxObjectCount = 0;
  158.     CharacterCount = 0;
  159.     MinPageX = 999999;
  160.     end;
  161.  
  162. visible procedure EndPageDisplay()
  163.     begin
  164.     gpr_$position_t WindowOrigin;
  165.     gpr_$window_t Rectangle;
  166.     status_$t Status;
  167.     int Index, i;
  168.     AcquireDisplay();
  169.     if (Xoffset == AutomaticXoffset) then
  170.         Xoffset = MinPageX-20;
  171.     WindowOrigin.x_coord = -Xoffset;
  172.     WindowOrigin.y_coord = -Yoffset;
  173.     gpr_$set_coordinate_origin(WindowOrigin,Status);
  174.     for (Index=0; Index<BoxObjectCount; Index++) do
  175.         begin
  176.         Rectangle.window_base.x_coord = BoxObjects[Index].X;
  177.         Rectangle.window_base.y_coord = BoxObjects[Index].Y;
  178.         Rectangle.window_size.x_size = BoxObjects[Index].Width;
  179.         Rectangle.window_size.y_size = BoxObjects[Index].Height;
  180.         for (i=0; i<ScreenVisibleCount; i++) do
  181.             begin
  182.             if (!ScreenUnobscured) then
  183.                 gpr_$set_clip_window(ScreenVisibleList[i],Status);
  184.             gpr_$rectangle(Rectangle,Status);
  185.             end;
  186.         end;
  187.     for (Index=0; Index<TextObjectCount; Index++) do
  188.         begin
  189.         short Start = TextObjects[Index].Start;
  190.         short Count = TextObjects[Index].Count;
  191.         short X = TextObjects[Index].X;
  192.         short Y = TextObjects[Index].Y;
  193.         short FontID = TextObjects[Index].FontID;
  194.         if (ScreenFontID != FontID) then
  195.             begin
  196.             gpr_$set_text_font(FontID,Status);
  197.             ScreenFontID = FontID;
  198.             end;
  199.         for (i=0; i<ScreenVisibleCount; i++) do
  200.             begin
  201.             if (!ScreenUnobscured) then
  202.                 gpr_$set_clip_window(ScreenVisibleList[i],Status);
  203.             gpr_$move(X,Y,Status);
  204.             gpr_$text(Characters[Start],Count,Status);
  205.             end;
  206.         end;
  207.     WindowOrigin.x_coord = 0;
  208.     WindowOrigin.y_coord = 0;
  209.     gpr_$set_coordinate_origin(WindowOrigin,Status);
  210.     ReleaseDisplay();
  211.     end;
  212.  
  213. visible procedure DrawBox(X,Y,Width,Height)
  214.     int X, Y, Width, Height;
  215.     begin
  216.     if (X < MinPageX) then MinPageX = X;
  217.     BoxObjects[BoxObjectCount].X = X;
  218.     BoxObjects[BoxObjectCount].Y = Y;
  219.     BoxObjects[BoxObjectCount].Width = Width;
  220.     BoxObjects[BoxObjectCount].Height = Height;
  221.     BoxObjectCount++;
  222.     if (BoxObjectCount == MaxBoxObjectsPerPage) then
  223.         ShowError("too many box objects on page");
  224.     end
  225.  
  226.  
  227. visible procedure DrawCharacter(Character,X,Y,FontID)
  228.     char Character;
  229.     short X, Y, FontID;
  230.     begin
  231.     status_$t Status;
  232.     if (X < MinPageX) then MinPageX = X;
  233.     if (TextObjectCount > 0
  234.         && X == TextObjects[TextObjectCount-1].Xlimit
  235.         && Y == TextObjects[TextObjectCount-1].Y
  236.         && FontID == TextObjects[TextObjectCount-1].FontID) then
  237.         begin
  238.         TextObjects[TextObjectCount-1].Count++;
  239.         TextObjects[TextObjectCount-1].Xlimit +=
  240.             FontCharacterWidths[FontID][Character];
  241.         end
  242.     else
  243.         begin
  244.         TextObjects[TextObjectCount].Start = CharacterCount;
  245.         TextObjects[TextObjectCount].Count = 1;
  246.         TextObjects[TextObjectCount].X = X;
  247.         TextObjects[TextObjectCount].Y = Y;
  248.         TextObjects[TextObjectCount].FontID = FontID;
  249.         TextObjects[TextObjectCount].Xlimit =
  250.             X+FontCharacterWidths[FontID][Character];
  251.         TextObjectCount++;
  252.         if (TextObjectCount == MaxTextObjectsPerPage) then
  253.             ShowError("too many text objects on page");
  254.         end;
  255.     Characters[CharacterCount] = Character;
  256.     CharacterCount++;
  257.     if (CharacterCount == MaxCharactersPerPage) then
  258.         ShowError("too many characters on page");
  259.     end
  260.  
  261. visible short LoadFontFile(FontFileName)
  262.     char *FontFileName;
  263.     begin
  264.     status_$t Status;
  265.     short FontID, HorizontalSpacing, CharacterWidth;
  266.     unsigned char Character;
  267.     gpr_$load_font_file(*FontFileName,(short)strlen(FontFileName),
  268.                 FontID,Status);
  269.     if (Status.all != status_$ok) then
  270.         begin
  271.         fprintf(stderr,"dviapollo: cannot load font %s\n",
  272.             FontFileName);
  273.         exit(1);
  274.         end;
  275.     if (FontID >= MaxFontID) then
  276.         ShowError("Font ID too large");
  277.     gpr_$inq_horizontal_spacing(FontID,HorizontalSpacing,Status);
  278.     for (Character=0; Character<128; Character++) do
  279.         begin
  280.         gpr_$inq_character_width(FontID,Character,CharacterWidth,Status);
  281.         FontCharacterWidths[FontID][Character] =
  282.             CharacterWidth+HorizontalSpacing;
  283.         end;
  284.     return FontID;
  285.     end
  286.  
  287.  
  288. visible procedure ClearError()
  289.     begin
  290.     end
  291.  
  292.  
  293. hidden procedure ResetPageOffsets()
  294.     begin
  295.     Xoffset = AutomaticXoffset;
  296.     Yoffset = 25;
  297.     end
  298.  
  299.  
  300. hidden procedure RedisplayScreen()
  301.     begin
  302.     CurrentPage = ShowDviPage(&CurrentDVIwindow,CurrentPage,0,0);
  303.     end
  304.  
  305.  
  306. hidden procedure RefreshProcedure(Unobscured,PositionChanged)
  307.     boolean *Unobscured, *PositionChanged;
  308.     begin
  309.     RedisplayScreen();
  310.     end;
  311.  
  312. hidden procedure CommandLoop()
  313.     begin
  314.     gpr_$event_t EventType;
  315.     unsigned char EventData[1];
  316.     gpr_$position_t EventPosition;
  317.     status_$t Status;
  318.     int Argument = 0;
  319.     while (true) do
  320.         begin
  321.         gpr_$event_wait(EventType,EventData[0],EventPosition,Status);
  322.         switch (EventData[0])
  323.             begin
  324.         case KBD_$EXIT:            return;
  325.         case KBD_$NEXT_WIN:        ResetPageOffsets();
  326.                         if (Argument > 0) then
  327.                         CurrentPage = Argument;
  328.                         break;
  329.         case KBD_$UP_BOX_ARROW2:    ResetPageOffsets();
  330.                         if (Argument == 0) then CurrentPage--;
  331.                         else CurrentPage -= Argument;
  332.                         break;
  333.         case KBD_$DOWN_BOX_ARROW2:  ResetPageOffsets();
  334.                         if (Argument == 0) then CurrentPage++;
  335.                         else CurrentPage += Argument;
  336.                         break;
  337.         case KBD_$UP_ARROW:        Yoffset = -123;
  338.                         break;
  339.         case KBD_$DOWN_ARROW:        Yoffset =
  340.                         11*123-ScreenBitmapSize.y_size;
  341.                         break;
  342.         case KBD_$LEFT_ARROW:        Xoffset = -123;
  343.                         break;
  344.         case KBD_$RIGHT_ARROW:        Xoffset =
  345.                         8*123+123/2-ScreenBitmapSize.x_size;
  346.                         break;
  347.         /* Shift UP BOX ARROW */
  348.         case KBD_$LDS:            ResetPageOffsets();
  349.                         CurrentPage = 1;
  350.                         break;
  351.         /* Shift DOWN BOX ARROW */
  352.         case KBD_$LFS:            ResetPageOffsets();
  353.                         CurrentPage = 999999;
  354.                         break;
  355.         case '0': case '1': case '2': case '3':
  356.         case '4': case '5': case '6': case '7':
  357.         case '8': case '9':        Argument *= 10;
  358.                         Argument += EventData[0]-'0';
  359.                         break;
  360.             end;
  361.         if (EventData[0] < '0' || EventData[0] > '9') then
  362.             begin
  363.             Argument = 0;
  364.             RedisplayScreen();
  365.             end;
  366.         end;
  367.     end;
  368.  
  369. visible procedure main(ArgCount,ArgVector,Environment)
  370.     int ArgCount;
  371.     char *ArgVector[], *Environment[];
  372.     begin
  373.     static pad_$window_desc_t Window = { 0, 0, 800, 1024 };
  374.     ios_$id_t StreamID;
  375.     gpr_$plane_t HiPlane;
  376.     gpr_$keyset_t KeySet;
  377.     status_$t Status;
  378.     boolean ColorDisplay;
  379.     char InputFileName[256];
  380.     short InputFileNameLength, Keystroke;
  381.     int InitialPageNumber = 1;
  382.     if (ArgCount < 2 || ArgCount > 3) then
  383.         begin
  384.         fprintf(stderr,"Usage: dviapollo dvifilename [pagenumber]\n");
  385.         exit(1);
  386.         end;
  387.     strcpy(InputFileName,ArgVector[1]);
  388.     InputFileNameLength = strlen(InputFileName);
  389.     if (InputFileNameLength < 5
  390.         || strcmp(&InputFileName[InputFileNameLength-4],".dvi") != 0) then
  391.         strcat(InputFileName,".dvi");
  392.     if ((AAFpath=getenv("TEX118AAF")) == NULL) then
  393.         AAFpath = FONTAREA;
  394.     if (access(InputFileName,R_OK) == -1) then
  395.         begin
  396.         fprintf(stderr,"dviapollo: cannot access %s\n",InputFileName);
  397.         exit(1);
  398.         end;
  399.     if (ArgCount == 3) then
  400.         InitialPageNumber = atoi(ArgVector[2]);
  401.  
  402.     pad_$create_window("",0,pad_$transcript,1,Window,StreamID,Status);
  403.     pad_$set_border(StreamID,1,false,Status);
  404.     pad_$set_auto_close(StreamID,1,true,Status);
  405.     ScreenBitmapSize.x_size = gpr_$max_x_size;
  406.     ScreenBitmapSize.y_size = gpr_$max_y_size;
  407.     gpr_$init(gpr_$direct,StreamID,ScreenBitmapSize,
  408.           gpr_$highest_plane,ScreenBitmap,Status);
  409.     gpr_$inq_bitmap_dimensions(ScreenBitmap,ScreenBitmapSize,HiPlane,Status);
  410.     gpr_$set_obscured_opt(gpr_$input_ok_if_obs,Status);
  411.     gpr_$set_refresh_entry(RefreshProcedure,NIL,Status);
  412.     ColorDisplay = (HiPlane > 0);
  413.     Background = (ColorDisplay ? gpr_$background : 0);
  414.     Foreground = (ColorDisplay ? 0 : 1);
  415.     gpr_$set_text_value(Foreground,Status);
  416.     gpr_$set_text_background_value(gpr_$transparent,Status);
  417.     gpr_$set_fill_value(Foreground,Status);
  418.     lib_$init_set(KeySet,256);
  419.     lib_$add_to_set(KeySet,256,KBD_$EXIT);
  420.     lib_$add_to_set(KeySet,256,KBD_$NEXT_WIN);
  421.     lib_$add_to_set(KeySet,256,KBD_$UP_BOX_ARROW2);
  422.     lib_$add_to_set(KeySet,256,KBD_$DOWN_BOX_ARROW2);
  423.     lib_$add_to_set(KeySet,256,KBD_$UP_ARROW);
  424.     lib_$add_to_set(KeySet,256,KBD_$DOWN_ARROW);
  425.     lib_$add_to_set(KeySet,256,KBD_$LEFT_ARROW);
  426.     lib_$add_to_set(KeySet,256,KBD_$RIGHT_ARROW);
  427.     lib_$add_to_set(KeySet,256,KBD_$LDS);
  428.     lib_$add_to_set(KeySet,256,KBD_$LFS);
  429.     for (Keystroke='0'; Keystroke<='9'; Keystroke++) do
  430.         lib_$add_to_set(KeySet,256,Keystroke);
  431.     gpr_$enable_input(gpr_$keystroke,KeySet,Status);
  432.     ResetPageOffsets();
  433.     CurrentDVIwindow = OpenDvi(InputFileName);
  434.     if (InitialPageNumber >= 0) then
  435.         begin
  436.         CurrentPage = InitialPageNumber;
  437.         RedisplayScreen();
  438.         CommandLoop();
  439.         end
  440.     else
  441.         begin
  442.         InitialPageNumber = 0;
  443.         CurrentPage = 0;
  444.         while (CurrentPage == InitialPageNumber) do
  445.             begin
  446.             CurrentPage++;
  447.             InitialPageNumber = CurrentPage;
  448.             RedisplayScreen();
  449.             end;
  450.         end;
  451.     gpr_$terminate(false,Status);
  452.     ios_$close(StreamID,Status);
  453.     end
  454.